昨天我們完成了talker.py這個Publisher,今天要來做負責接收的Subscriber囉!
一樣先到我們放程式的資料夾,並且下載官方範例,以及指定成可執行的檔案:
$ roscd beginner_tutorials/src
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/listener.py
$ chmod +x listener.py
可以看到裡面其實是一個很簡單的15行程式:
   1 #!/usr/bin/env python
   2 import rospy
   3 from std_msgs.msg import String
   4 
   5 def callback(data):
   6     rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
   7 
   8 def listener():
   9     rospy.init_node('listener', anonymous=True)
  10     rospy.Subscriber("chatter", String, callback)
  11     # spin() simply keeps python from exiting until this node is stopped
  12     rospy.spin()
  13 
  14 if __name__ == '__main__':
  15     listener()
裡面最主要的就是callback和listener這兩個函式,先講listener好了,也就是第8~12行:
   8 def listener():
   9     rospy.init_node('listener', anonymous=True)
  10     rospy.Subscriber("chatter", String, callback)
  11     # spin() simply keeps python from exiting until this node is stopped
  12     rospy.spin()
首先一樣先定義了一個叫做listener的node,並且定義了一個Subscriber,會去監聽chatter這個topic,透過String格式的訊息傳輸,並在接收到訊息之後呼叫callback function。
接著第12行就是可以讓這個node不停止,就可以持續的監聽topic有沒有新的訊息囉!
在收到訊息以後,會呼叫一個callback function,也就是第5~6行所定義的callback這個函式:
   5 def callback(data):
   6     rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
其實就是收到訊息(data)之後把它印出來啦!
執行畫面會長這樣:
左上角是roscore執行畫面,右上可以看到有talker和listener這兩個node在執行,並且有一個叫做/chatter的topic,左下角是publisher,右下就是subscriber接收到的畫面囉!
Subscriber感覺比Publisher簡單,但是要先知道Publisher所定義的Topic名稱和Messenge格式,才能去監聽這個topic。